﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using SPMS.Utility;
using SPMS.Log.Core;
using SPMS.Log.Utility;

namespace SPMS.Log.Formatter
{
    /// <summary>
    /// 模板日志格式化器
    /// </summary>
    /// <remarks>根据指定的模板格式化日志信息</remarks>
    /// <history>
    /// [zanezeng]               2009/9/29 14:31    创建
    /// </history>
    public sealed class PatternFormatter : AbstractFormatter
    {
        #region ---Protected Method

        /// <summary>
        /// 将给定的日志条目格式化为一个有序的字符串序列
        /// </summary>
        /// <param name="entry">要进行格式化的日志记录</param>
        /// <returns>描述给定日志记录的一个有序的字符串序列</returns>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/13 10:19    创建
        /// </history>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/13 10:32    创建
        /// </history>
        protected override string FormatEntry( LogEntry entry )
        {
            //使用模板解析日志条目
            return this.Parser.Parse( entry, this.FormatProvider );
        }

        #endregion

        #region ---Property

        /// <summary>
        /// 获得或者设置格式化模板
        /// </summary>
        /// <value>格式化模板</value>
        /// <remarks></remarks>
        /// <exception cref="ArgumentNullException"><paramref name="value"/>为<c>null</c>引用或者为空字符串</exception>
        /// <exception cref="InvalidOperationException"><paramref name="value"/>不是合法的日志模板</exception>
        /// <history>
        /// [zanezeng]               2009/9/29 14:46    创建
        /// </history>
        public string Pattern
        {
            get
            {
                //返回设置的模板
                return this.m_Pattern;
            }
            set
            {
                //断言参数
                ArgumentAssert.AssertStringArgumentNotNullOrEmpty( value, "value" );

                //判断模板内容是否发生变化
                if (0 == string.Compare( this.m_Pattern, value ))
                {
                    //如果没有发生变化，则直接返回
                    return;
                }

                //创建模板解析器
                PatternParser parser = new PatternParser( value );

                //设置为当前模板解析器
                this.m_Parser = parser;

                //保存模板
                this.m_Pattern = value;
            }
        }

        /// <summary>
        /// 获得模板解析器
        /// </summary>
        /// <value>模板解析器</value>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/13 10:36    创建
        /// </history>
        private PatternParser Parser
        {
            get
            {
                //判断是否设置了模板解析器
                if (null == this.m_Parser)
                {
                    //如果没有设置模板解析器，则返回默认的模板解析器
                    return DEFAULT_PARSER;
                }

                //返回设置的模板解析器
                return this.m_Parser;
            }
        }

        #endregion

        #region ---Field

        /// <summary>
        /// 格式化模板
        /// </summary>
        private string m_Pattern;

        /// <summary>
        /// 模板解析器
        /// </summary>
        private PatternParser m_Parser;

        /// <summary>
        /// 默认的模板解析器
        /// </summary>
        private static readonly PatternParser DEFAULT_PARSER = new PatternParser( DEFAULT_PATTERN );

        /// <summary>
        /// 默认日志模板
        /// </summary>
        private const string DEFAULT_PATTERN = "{Level,-10} [{Timestamp:yyyy/MM/dd HH:mm:ss fff}] [{Message}] [{ThreadName}] [{TypeName}::{MethodName}] [{FileName}:{LineNumber}] \r\n{Exception}";

        #endregion
    }
}
